package com.martys.singleton06;


/**
 *  懒汉式单例模式 --双重检查
 */
//"优点： 懒加载避免了资源可能浪费 双重检查+禁止指令重排序保证了线程安全问题，而且对于后续的get操作并不会进行同步，因此效率也较高 "
//"缺点： 推荐使用
public class Singleton06 {
    //1 将构造方法设置为私有的
    private Singleton06() {}

    //2 创建静态类对象实例
    private  static  volatile Singleton06 instance ;  //这里的volatile是为了避免指令重排序，详细见下
    /*
    * instance = new Singleton06();可以大致分为三步：
    * memory = allocate();      1.分配内存
    * instance(memory);	        2.初始化对象
    * instance = memory;	    3.设置引用地址
    * 由于2 3没有数据依赖关系，导致可能存在指令重排序，如果两者倒转，3先执行了此时instance!=null 外层判断通过直接返回instance，但是因为没有instance(memory)初始化对象所以返回的只能是null
    */

    //3 开放一个返回的方法，检查-锁-检查-实例化
    public static Singleton06 getInstance() {
       if(instance == null){
           synchronized (Singleton06.class) {
               if(instance ==null){
                   instance = new Singleton06();
               }
           }
       }
        return instance;
    }

}
